“Baby Mental Life: Study 1” was conducted on MTurk on 2018-07-31.

Our planned sample was 300 participants, and we anticipated that roughly 85-90% of recruited participants would pass all of our attention checks, so we initially recruited 342 participants. After filtering out participants who failed at least one of our attention checks, we ended up retaining only XX participants, so we recruited an additional XX participants. In the end, we ended up with a sample of XX participants who passed our attention checks (out of XX participants recruited in total).

Each participant assessed children’s mental capacities at 3 target ages: newborns, 9-month-olds, and 5-year-olds. For each target, they rated 60 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable).

For more details about the study, see our preregistration here.

# load required libraries
library(tidyverse)
── Attaching packages ────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.0.0     ✔ purrr   0.2.5
✔ tibble  1.4.2     ✔ dplyr   0.7.6
✔ tidyr   0.8.1     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
── Conflicts ───────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(langcog) # source: https://github.com/langcog/langcog-package

Attaching package: ‘langcog’

The following object is masked from ‘package:base’:

    scale
library(psych)

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
# set theme for ggplots
theme_set(theme_bw())
# run source code (extra functions)
source("./scripts/max_factors_efa.R")
# make function for implementing criteria
reten_fun <- function(df, rot_type = c("oblimin", "varimax", "none")){
  
  # figure out max number of factors to retain
  n_var <- length(names(df))
  max_k <- max_ok(n_var)
  
  # run efa with max factors, unrotated
  fa_unrot <- fa(df, nfactors = max_k, rotate = "none")
  eigen <- fa_unrot$Vaccounted %>%
    data.frame() %>%
    rownames_to_column("param") %>%
    gather(factor, value, -param) %>%
    spread(param, value) %>%
    filter(`SS loadings` > 1, `Proportion Explained` > 0.05)
  retain_k <- nrow(eigen)
  
  fa_rot <- fa(df, nfactors = retain_k, rotate = rot_type)
  loadings <- fa_rot$loadings[] %>%
    data.frame() %>%
    rownames_to_column("capacity") %>%
    gather(factor, loading, -capacity) %>%
    group_by(capacity) %>%
    top_n(1, abs(loading)) %>%
    ungroup() %>%
    count(factor)
  retain_k_final <- nrow(loadings)
  
  return(retain_k_final)
}
# make function for generating heatmap
heatmap_fun <- function(efa){
  
  # get factor loadings
  loadings <- efa$loadings[] %>%
    data.frame() %>%
    rownames_to_column("capacity") %>%
    gather(factor, loading, -capacity)
  
  # get fa.sort() order
  order <- loadings %>%
    group_by(capacity) %>%
    top_n(1, abs(loading)) %>%
    ungroup() %>%
    arrange(factor, abs(loading)) %>%
    mutate(order = 1:length(levels(factor(loadings$capacity)))) %>%
    select(capacity, order)
  
  # make plot
  plot <- ggplot(loadings %>% 
                   left_join(order) %>%
                   mutate(capacity = gsub("_", " ", capacity)),
                 aes(x = factor, 
                     y = reorder(capacity, order), 
                     fill = loading, 
                     label = format(round(loading, 2), nsmall = 2))) +
    geom_tile(color = "black") +
    geom_text(size = 3) +
    scale_fill_distiller(limits = c(-1, 1), 
                         palette = "RdYlBu",
                         guide = guide_colorbar(barheight = 20)) +
    theme_minimal() +
    scale_x_discrete(position = "top") +
    labs(x = "", y = "")
  
  return(plot)
}
# make function for plotting factor scores by factor, target
scoresplot_fun <- function(efa, 
                          target = c("all", "newborns", "9-month-olds", "5-year-olds")){
  
  # generate list of targets
  target_list <- case_when(
    target == "all" ~ c("target00mo", "target09mo", "target60mo"),
    target == "newborns" ~ "target00mo",
    target == "9-month-olds" ~ "target09mo",
    target == "5-year-olds" ~ "target60mo"
  )
  
  # make usable dataframe
  df <- efa$scores[] %>%
    data.frame() %>%
    rownames_to_column("subid") %>%
    mutate(ResponseId = gsub("_target.*$", "", subid),
           target = gsub("R_.*_", "", subid)) %>%
    filter(target %in% target_list) %>%
    select(-subid) %>%
    gather(factor, score, -c(ResponseId, target)) %>%
    mutate(target = recode_factor(target,
                                  "target00mo" = "newborns",
                                  "target09mo" = "9-month-olds",
                                  "target60mo" = "5-year-olds"))
  
  # get bootstrapped means
  df_boot <- df %>%
    group_by(target, factor) %>%
    multi_boot_standard("score", na.rm = T) %>%
    ungroup()
  
  # get first items for each factor
  first_items <- efa$loadings[] %>%
    data.frame() %>%
    rownames_to_column("capacity") %>%
    gather(factor, loading, -capacity) %>%
    group_by(factor) %>%
    top_n(3, abs(loading)) %>%
    mutate(capacity = gsub("_", " ", capacity),
           cap_list = str_c(capacity, collapse = ", "),
           cap_list = paste0(cap_list, "...")) %>%
    ungroup() %>%
    select(-capacity, -loading) %>%
    distinct()
  # make plot
  plot <- ggplot(df,
                 aes(x = target, 
                     y = score, 
                     color = factor)) +
    facet_grid(~ factor) +
    geom_path(aes(group = ResponseId), alpha = 0.1) +
    geom_path(data = df_boot,
              aes(y = mean, group = factor), color = "black", lty = 2) +
    geom_pointrange(data = df_boot,
                    aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                    color = "black", fatten = 0.75) +
    geom_text(data = first_items,
              aes(label = gsub('(.{1,30})(\\s|$)', '\\1\n', cap_list)),
              x = 0.5, y = max(df$score), size = 3, color = "black",
              hjust = 0, vjust = 1) +
    theme_bw() +
    labs(x = "target", y = "factor score",
         subtitle = "Error bars are bootstrapped 95% confidence intervals") +
    guides(color = "none")
    # guides(color = guide_legend(override.aes = list(alpha = 1, size = 1)))
  
  return(plot)
  
}
# make function for plotting individual item means by factor, target
itemsplot_fun <- function(efa,
                           target = c("all", "newborns", "9-month-olds", "5-year-olds")){
  
  # generate list of targets
  target_list <- case_when(
    target == "all" ~ c("target00mo", "target09mo", "target60mo"),
    target == "newborns" ~ "target00mo",
    target == "9-month-olds" ~ "target09mo",
    target == "5-year-olds" ~ "target60mo"
  )
  
  # make usable dataframe
  df <- d_all %>%
    rownames_to_column("subid") %>%
    mutate(ResponseId = gsub("_target.*$", "", subid),
           target = gsub("R_.*_", "", subid)) %>%
    filter(target %in% target_list) %>%
    select(-subid) %>%
    gather(capacity, response, -c(ResponseId, target)) %>%
    mutate(target = recode_factor(target,
                                  "target00mo" = "newborns",
                                  "target09mo" = "9-month-olds",
                                  "target60mo" = "5-year-olds"))
  
  # get factor loadings
  loadings <- efa$loadings[] %>%
    data.frame() %>%
    rownames_to_column("capacity") %>%
    gather(factor, loading, -capacity)
  
  # get fa.sort() order
  order <- efa$loadings[] %>%
    data.frame() %>%
    rownames_to_column("capacity") %>%
    gather(factor, loading, -capacity) %>%
    group_by(capacity) %>%
    top_n(1, abs(loading)) %>%
    ungroup() %>%
    arrange(factor, abs(loading)) %>%
    mutate(order = 1:length(levels(factor(loadings$capacity)))) %>%
    select(factor, capacity, order)
  
  # add order to df
  df <- df %>% left_join(order)
  
  # get bootstrapped means
  df_boot <- df %>%
    group_by(target, factor, capacity, order) %>%
    multi_boot_standard("response", na.rm = T) %>%
    ungroup() %>%
    mutate(capacity = gsub("_", " ", capacity))
    
  # make plot
  plot <- ggplot(df %>% 
                   left_join(order) %>%
                   mutate(capacity = gsub("_", " ", capacity)),
                 aes(x = response, 
                     y = reorder(capacity, order), 
                     color = factor)) +
    facet_grid(factor ~ target, scales = "free", space = "free") +
    geom_point(alpha = 0.02) +
    geom_errorbarh(data = df_boot, 
                   aes(xmin = ci_lower, xmax = ci_upper, x = NULL),
                   color = "black", height = 0) +
    geom_point(data = df_boot,
               aes(x = mean),
               color = "black", size = 2) +
    theme_bw() +
    labs(x = "response", y = "",
         subtitle = "Error bars are bootstrapped 95% confidence intervals") +
    guides(color = "none")
    # guides(color = guide_legend(override.aes = list(alpha = 1, size = 2)))
  
  return(plot)
  
}

Data preparation

# load in raw data
d0 <- read.csv("./data/Baby mental life: Study 1_August 1, 2018_04.38.csv")
# make question key
question_key <- d0[1,] %>%
  t() %>%
  data.frame() %>%
  rownames_to_column("question_qualtrics") %>%
  rename("question_text" = X1) %>%
  mutate(question = recode(question_qualtrics,
                           "Duration..in.seconds." = "Duration",
                           "Q2" = "Age",
                           "Q3" = "GenderSex",
                           "Q3_3_TEXT" = "GenderSex_fillIn",
                           "Q4" = "EnglishProf",
                           "Q5" = "FirstLang",
                           "Q5_2_TEXT" = "FirstLang_fillIn",
                           "Q18" = "RaceEthnicity",
                           "Q18_10_TEXT" = "RaceEthnicity_fillIn",
                           "Q19" = "Education",
                           "Q20" = "Income",
                           "Q21" = "MaritalStatus",
                           "Q21_6_TEXT" = "MaritalStatus_fillIn",
                           "Q22" = "HouseholdSize",
                           "Q23" = "Parent",
                           "Q25" = "ChildrenNumber",
                           "Q26" = "ChildrenYoungestAge",
                           "Q26_1_TEXT" = "ChildrenYoungestAge_fillIn1",
                           "Q26_2_TEXT" = "ChildrenYoungestAge_fillIn2",
                           "Q27" = "ChildrenOldestAge",
                           "Q27_1_TEXT" = "ChildrenOldestAge_fillIn1",
                           "Q27_2_TEXT" = "ChildrenOldestAge_fillIn2",
                           "Q28" = "Attention",
                           "Q29" = "Comments",
                           .default = question_qualtrics),
         question = case_when(grepl("the following questions", question_text) ~
                                gsub("^.*extent is a ", "", question_text),
                              TRUE ~ question),
         question = case_when(grepl("capable of...", question_text) ~
                                gsub("capable of... ", "", tolower(question)),
                              TRUE ~ question),
         question = gsub(" ", "_", question),
         question = gsub("'", "", question),
         question = gsub("newborn_-_", "target00mo_", question),
         question = gsub("9-month-old_-_", "target09mo_", question),
         question = gsub("5-year-old_-_", "target60mo_", question)) %>%
  mutate(question = gsub("-", "_", question),
         question = gsub(" \\(for_example,_smooth,_rough\\)", "", question))
# rename questions
d1 <- d0 %>%
  filter(grepl("R_", ResponseId)) %>% # get rid of extra info in first two rows
  gather(question_qualtrics, response, -ResponseId) %>%
  left_join(question_key %>% select(question_qualtrics, question)) %>%
  select(-question_qualtrics) %>%
  spread(question, response)
attributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"
# implement inclusion/exclusion criteria
d2 <- d1 %>%
  filter(Age >= 18, Age <= 45,
         EnglishProf %in% c("Advanced", "Superior"),
         `target00mo_please_select_34` == 34,
         `target09mo_please_select_90` == 90,
         `target60mo_please_select_4` == 4,
         Attention == "Yes")
# recode variables & drop extraneous variables
d3 <- d2 %>%
  select(-c(DistributionChannel, EndDate, ExternalReference, Finished, IPAddress, 
            starts_with("Location"), MTurkCode, payment, Progress, 
            starts_with("Recipient"), RecordedDate, StartDate, Status, 
            timeEstimate, UserLanguage)) %>%
  mutate_at(vars(c(starts_with("target"), Age, ChildrenNumber, 
                   ChildrenOldestAge_fillIn1, ChildrenOldestAge_fillIn2, 
                   ChildrenYoungestAge_fillIn1, ChildrenYoungestAge_fillIn2,
                   Duration, HouseholdSize)),
            funs(as.numeric(.))) %>%
  mutate(Education = factor(Education,
                            levels = c("No schooling completed", 
                                       "Nursery school to 8th grade", 
                                       "Some high school, no diploma", 
                                       "High school graduate, diploma or equivalent (including GED)", 
                                       "Some college credit, no degree", 
                                       "Trade school, technical school, or vocational school",
                                       "Associate's degree (for example, AA, AS)",
                                       "Bachelor's degree (for example, BA, BS)",
                                       "Master's degree (for example, MA, MS)",
                                       "Doctor or professional degree (for example, PhD, JD, MD, MBA)")),
         Income = factor(Income,
                         levels = c("$5,001 - 15,000", 
                                    "$15,001 - 30,000", 
                                    "$30,001 - 60,000",
                                    "$60,001 - 90,000",
                                    "$90,001 - 150,000",
                                    "Greater than $150,000",
                                    "Prefer not to say")),
         Parent = factor(Parent,
                         levels = c("No", "Yes")))
NAs introduced by coercion
# make useful datasets
# final dataset with all measured variables
d <- d3 %>% distinct()
# demographic information
d_demo <- d %>% 
  select(ResponseId, Duration,
         Age, starts_with("GenderSex"), starts_with("RaceEthnicity"),
         starts_with("FirstLang"),
         Education, Income, HouseholdSize,
         starts_with("MaritalStatus"),
         Parent, starts_with("Children"), 
         Comments) %>%
  mutate(RaceEthnicity_collapse = ifelse(grepl(",([A-Za-z])", RaceEthnicity),
                                         "Multiple", RaceEthnicity)) %>%
  mutate(ChildrenOldestAge_collapse = case_when(
    ChildrenOldestAge %in% c("My oldest child has not yet been born (I am/my partner is pregnant)", "My oldest child is deceased", "Prefer not to say") ~ ChildrenOldestAge,
    ChildrenOldestAge == "In months:" ~ 
      ifelse(as.numeric(ChildrenOldestAge_fillIn1)/12 < 1,
             "< 1 year",
             ifelse(as.numeric(ChildrenOldestAge_fillIn1)/12 < 3, 
                    "1 - 3 years",
                    ifelse(as.numeric(ChildrenOldestAge_fillIn1)/12 < 5, 
                           "3 - 5 years",
                           ifelse(as.numeric(ChildrenOldestAge_fillIn1)/12 < 10, 
                                  "5 - 10 years",
                                  ifelse(as.numeric(ChildrenOldestAge_fillIn1)/12 < 18, 
                                         "10 - 18 years",
                                         "> 18 years"))))),
    ChildrenOldestAge == "In years:" ~
      ifelse(as.numeric(ChildrenOldestAge_fillIn2) < 1,
             "< 1 year",
             ifelse(as.numeric(ChildrenOldestAge_fillIn2) < 3, 
                    "1 - 3 years",
                    ifelse(as.numeric(ChildrenOldestAge_fillIn2) < 5, 
                           "3 - 5 years",
                           ifelse(as.numeric(ChildrenOldestAge_fillIn2) < 10, 
                                  "5 - 10 years",
                                  ifelse(as.numeric(ChildrenOldestAge_fillIn2) < 18, 
                                         "10 - 18 years",
                                         "> 18 years"))))),
    TRUE ~ "NA")) %>%
  mutate(ChildrenOldestAge_collapse = 
           factor(ChildrenOldestAge_collapse,
                  levels = c("My oldest child has not yet been born (I am/my partner is pregnant)",
                             "< 1 year",
                             "1 - 3 years",
                             "3 - 5 years",
                             "5 - 10 years",
                             "10 - 18 years",
                             "> 18 years",
                             "My oldest child is deceased",
                             "Prefer not to say"))) %>%
  mutate(ChildrenYoungestAge_collapse = case_when(
    ChildrenYoungestAge %in% c("My youngest child has not yet been born (I am/my partner is pregnant)", "My youngest child is deceased", "Prefer not to say") ~ ChildrenYoungestAge,
    ChildrenYoungestAge == "In months:" ~ 
      ifelse(as.numeric(ChildrenYoungestAge_fillIn1)/12 < 1,
             "< 1 year",
             ifelse(as.numeric(ChildrenYoungestAge_fillIn1)/12 < 3, 
                    "1 - 3 years",
                    ifelse(as.numeric(ChildrenYoungestAge_fillIn1)/12 < 5, 
                           "3 - 5 years",
                           ifelse(as.numeric(ChildrenYoungestAge_fillIn1)/12 < 10, 
                                  "5 - 10 years",
                                  ifelse(as.numeric(ChildrenYoungestAge_fillIn1)/12 < 18, 
                                         "10 - 18 years",
                                         "> 18 years"))))),
    ChildrenYoungestAge == "In years:" ~
      ifelse(as.numeric(ChildrenYoungestAge_fillIn2) < 1,
             "< 1 year",
             ifelse(as.numeric(ChildrenYoungestAge_fillIn2) < 3, 
                    "1 - 3 years",
                    ifelse(as.numeric(ChildrenYoungestAge_fillIn2) < 5, 
                           "3 - 5 years",
                           ifelse(as.numeric(ChildrenYoungestAge_fillIn2) < 10, 
                                  "5 - 10 years",
                                  ifelse(as.numeric(ChildrenYoungestAge_fillIn2) < 18, 
                                         "10 - 18 years",
                                         "> 18 years"))))),
    TRUE ~ "NA")) %>%
  mutate(ChildrenYoungestAge_collapse = 
           factor(ChildrenYoungestAge_collapse,
                  levels = c("My Youngest child has not yet been born (I am/my partner is pregnant)",
                             "< 1 year",
                             "1 - 3 years",
                             "3 - 5 years",
                             "5 - 10 years",
                             "10 - 18 years",
                             "> 18 years",
                             "My Youngest child is deceased",
                             "Prefer not to say")))  
# all assessments of ALL TARGETS, RepsonseId as rownames
d_all <- d %>% 
  select(ResponseId, starts_with("target"), -contains("please_select")) %>%
  gather(question, response, -ResponseId) %>%
  mutate(target = gsub("_.*$", "", question),
         capacity = gsub("target..mo_", "", question),
         subid = paste(ResponseId, target, sep = "_")) %>%
  select(-ResponseId, -question, -target) %>%
  spread(capacity, response) %>%
  column_to_rownames("subid")
# all assessments of NEWBORNS, RepsonseId as rownames
d_00mo <- d_all %>% 
  rownames_to_column("subid") %>%
  filter(grepl("target00mo", subid)) %>%
  mutate(subid = gsub("target..mo_", "", subid)) %>%
  column_to_rownames("subid")
# all assessments of 9-MONTH-OLDS, RepsonseId as rownames
d_09mo <- d_all %>% 
  rownames_to_column("subid") %>%
  filter(grepl("target09mo", subid)) %>%
  mutate(subid = gsub("target..mo_", "", subid)) %>%
  column_to_rownames("subid")
# all assessments of 5-YEAR-OLDS, RepsonseId as rownames
d_60mo <- d_all %>% 
  rownames_to_column("subid") %>%
  filter(grepl("target60mo", subid)) %>%
  mutate(subid = gsub("target..mo_", "", subid)) %>%
  column_to_rownames("subid")

EFA: all targets

Our primary analysis is an exploratory factor analysis (EFA) collapsing across all 3 target characters (and treating an individual participant’s responses to each character as if they were independent data points) - see the preregistration for more details.

We planned to examine three factor retention protocols in order to determine how many factors to retain: Parallel analysis, minimizing BIC, and a set of preset criteria outlined in Weisman et al. (2017). Here we look at each solution in turn.

Parallel analysis

How many factors to retain?

reten_all_PA <- fa.parallel(d_all, plot = F); reten_all_PA
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 

 Eigen Values of 
  Original factors Simulated data Original components simulated data
1            33.72           0.59               34.13           1.57
2             7.02           0.52                7.57           1.51
3             1.17           0.49                1.66           1.48
4             0.91           0.46                1.35           1.45
reten_all_par <- reten_all_PA$nfact

What are these factors?

efa_all_par <- fa(d_all, reten_all_par, "oblimin")
 A loading greater than abs(1) was detected.  Examine the loadings carefully.
heatmap_fun(efa_all_par) + 
  labs(title = "Parallel Analysis") #+
Joining, by = "capacity"

  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 0.5, xmax = 1.5, ymin = 1.5, ymax = 21.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 25.5, ymax = 33.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 22.5, ymax = 24.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 2.5, xmax = 3.5, ymin = 33.5, ymax = 34.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 2.5, xmax = 3.5, ymin = 36.5, ymax = 54.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 54.5, ymax = 55.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 56.5, ymax = 57.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 58.5, ymax = 60.5)

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_par, target = "all") + 
  labs(title = "Parallel Analysis") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

itemsplot_fun(efa_all_par, target = "all") + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"

|======================================================       | 89% ~0 s remaining     
|=======================================================      | 92% ~0 s remaining     
|========================================================     | 93% ~0 s remaining     
|==========================================================   | 96% ~0 s remaining     
|============================================================ | 99% ~0 s remaining     
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?

reten_all_vss <- VSS(d_all, plot = F); reten_all_vss

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.95  with  1  factors
VSS complexity 2 achieves a maximimum of 0.99  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  6  factors 
BIC achieves a minimum of  -5999.22  with  6  factors
Sample Size adjusted BIC achieves a minimum of  -1616.31  with  8  factors

Statistics by number of factors 
  vss1 vss2    map  dof chisq     prob sqresid  fit RMSEA   BIC SABIC complex eChisq
1 0.95 0.00 0.0653 1710 21267  0.0e+00    67.6 0.95 0.120  9797 15227     1.0  45047
2 0.59 0.99 0.0130 1651  8728  0.0e+00    10.3 0.99 0.074 -2347  2896     1.5   3270
3 0.45 0.84 0.0084 1593  6346  0.0e+00     7.6 0.99 0.062 -4340   719     2.0   1749
4 0.44 0.75 0.0059 1536  4809  0.0e+00     5.8 1.00 0.052 -5494  -617     2.3    882
5 0.43 0.76 0.0053 1480  4009 1.0e-231     5.2 1.00 0.047 -5919 -1219     2.3    632
6 0.43 0.75 0.0052 1425  3560 5.4e-183     4.8 1.00 0.044 -5999 -1474     2.4    502
7 0.43 0.75 0.0054 1371  3280 1.4e-157     4.5 1.00 0.042 -5916 -1563     2.4    433
8 0.43 0.74 0.0058 1318  3039 2.5e-137     4.3 1.00 0.041 -5802 -1616     2.5    377
   SRMR eCRMS  eBIC
1 0.125 0.127 33576
2 0.034 0.035 -7805
3 0.025 0.026 -8937
4 0.017 0.019 -9422
5 0.015 0.016 -9296
6 0.013 0.015 -9057
7 0.012 0.014 -8764
8 0.011 0.013 -8464
reten_all_bic <- data.frame(reten_all_vss$vss.stats %>%
  rownames_to_column("nfactors") %>%
  top_n(-1, BIC) %>%
  select(nfactors))$nfactors %>% as.numeric()

What are these factors?

efa_all_bic <- fa(d_all, reten_all_bic, "oblimin")
convergence not obtained in GPFoblq. 1000 iterations used.
heatmap_fun(efa_all_bic) + 
  labs(title = "Minimizing BIC") #+
Joining, by = "capacity"

  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 0.5, xmax = 1.5, ymin = 0.5, ymax = 21.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 22.5, ymax = 32.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 2.5, xmax = 3.5, ymin = 32.5, ymax = 48.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 49.5, ymax = 50.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 51.5, ymax = 52.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 4.5, xmax = 5.5, ymin = 52.5, ymax = 54.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 4.5, xmax = 5.5, ymin = 56.5, ymax = 60.5)

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_bic, target = "all") + 
  labs(title = "Minimizing BIC") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

itemsplot_fun(efa_all_bic, target = "all") + 
  labs(title = "Minimizing BIC")
Joining, by = "capacity"

|================================================             | 79% ~1 s remaining     
|=================================================            | 81% ~0 s remaining     
|==================================================           | 83% ~0 s remaining     
|====================================================         | 86% ~0 s remaining     
|======================================================       | 89% ~0 s remaining     
|=======================================================      | 92% ~0 s remaining     
|=========================================================    | 94% ~0 s remaining     
|===========================================================  | 97% ~0 s remaining     
|=============================================================|100% ~0 s remaining     
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

reten_all_k <- reten_fun(d_all, rot_type = "oblimin")
print(paste("Preset criteria suggest retaining", reten_all_k, "factors"))
[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

efa_all_k <- fa(d_all, reten_all_k, "oblimin")
heatmap_fun(efa_all_k) + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)") #+
Joining, by = "capacity"

  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 0.5, xmax = 1.5, ymin = 0.5, ymax = 30.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 33.5, ymax = 60.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 30.5, ymax = 31.5)

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_k, target = "all") + 
  labs(title = "Preset factor retention criteria (Weisman et al., 2017)")

itemsplot_fun(efa_all_k, target = "all") + 
  labs(title = "Preset factor retention criteria (Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: newborns

What happens if we limit ourselves to assessments of newborns’ mental capacities?

Parallel analysis

How many factors to retain?

reten_00mo_PA <- fa.parallel(d_00mo, plot = F); reten_00mo_PA
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 
Call: fa.parallel(x = d_00mo, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 

 Eigen Values of 
  Original factors Simulated data Original components simulated data
1            26.10           1.12               26.61           2.07
2             9.07           0.97                9.73           1.96
3             1.48           0.89                2.14           1.87
4             1.13           0.82                1.67           1.81
reten_00mo_par <- reten_00mo_PA$nfact

What are these factors?

efa_00mo_par <- fa(d_00mo, reten_00mo_par, "oblimin")
Loading required namespace: GPArotation
 A loading greater than abs(1) was detected.  Examine the loadings carefully.
heatmap_fun(efa_00mo_par) + 
  labs(title = "Parallel Analysis") #+
Joining, by = "capacity"

  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 0.5, xmax = 1.5, ymin = 1.5, ymax = 21.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 25.5, ymax = 33.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 22.5, ymax = 24.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 2.5, xmax = 3.5, ymin = 33.5, ymax = 34.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 2.5, xmax = 3.5, ymin = 36.5, ymax = 54.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 54.5, ymax = 55.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 56.5, ymax = 57.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 58.5, ymax = 60.5)

Which capacities are attributed to newborns?

itemsplot_fun(efa_00mo_par, target = "newborns") + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?

reten_00mo_vss <- VSS(d_00mo, plot = F); reten_00mo_vss

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.86  with  1  factors
VSS complexity 2 achieves a maximimum of 0.98  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  4  factors 
BIC achieves a minimum of  -6008.43  with  4  factors
Sample Size adjusted BIC achieves a minimum of  -1263.12  with  8  factors

Statistics by number of factors 
  vss1 vss2    map  dof chisq     prob sqresid  fit RMSEA   BIC SABIC complex eChisq
1 0.86 0.00 0.0767 1710  8498  0.0e+00   112.9 0.86 0.127 -1094  4328     1.0  25186
2 0.66 0.98 0.0161 1651  3875 7.9e-180    18.2 0.98 0.076 -5386  -151     1.4   1988
3 0.57 0.94 0.0095 1593  3033  1.6e-92    13.7 0.98 0.063 -5902  -851     1.6   1140
4 0.45 0.78 0.0080 1536  2608  1.4e-58    11.1 0.99 0.056 -6008 -1138     2.1    719
5 0.48 0.80 0.0080 1480  2420  2.0e-48    10.1 0.99 0.054 -5882 -1190     2.1    610
6 0.48 0.79 0.0081 1425  2253  2.2e-40     9.3 0.99 0.052 -5740 -1222     2.2    520
7 0.46 0.78 0.0084 1371  2116  7.0e-35     8.5 0.99 0.051 -5574 -1227     2.3    447
8 0.47 0.79 0.0084 1318  1951  2.0e-27     7.8 0.99 0.048 -5442 -1263     2.3    377
   SRMR eCRMS  eBIC
1 0.161 0.164 15594
2 0.045 0.047 -7273
3 0.034 0.036 -7795
4 0.027 0.029 -7897
5 0.025 0.027 -7692
6 0.023 0.026 -7474
7 0.021 0.024 -7244
8 0.020 0.023 -7016
reten_00mo_bic <- data.frame(reten_00mo_vss$vss.stats %>%
  rownames_to_column("nfactors") %>%
  top_n(-1, BIC) %>%
  select(nfactors))$nfactors %>% as.numeric()

What are these factors?

efa_00mo_bic <- fa(d_00mo, reten_00mo_bic, "oblimin")
 A loading greater than abs(1) was detected.  Examine the loadings carefully.
heatmap_fun(efa_00mo_bic) + 
  labs(title = "Minimizing BIC") #+
Joining, by = "capacity"

  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 0.5, xmax = 1.5, ymin = 0.5, ymax = 21.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 22.5, ymax = 32.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 2.5, xmax = 3.5, ymin = 32.5, ymax = 48.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 49.5, ymax = 50.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 3.5, xmax = 4.5, ymin = 51.5, ymax = 52.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 4.5, xmax = 5.5, ymin = 52.5, ymax = 54.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 4.5, xmax = 5.5, ymin = 56.5, ymax = 60.5)

Which capacities are attributed to newborns?

itemsplot_fun(efa_00mo_bic, target = "newborns") + 
  labs(title = "Minimizing BIC")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

reten_00mo_k <- reten_fun(d_00mo, rot_type = "oblimin")
print(paste("Preset criteria suggest retaining", reten_00mo_k, "factors"))
[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

efa_00mo_k <- fa(d_00mo, reten_00mo_k, "oblimin")
heatmap_fun(efa_00mo_k) + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)") #+
Joining, by = "capacity"

  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 0.5, xmax = 1.5, ymin = 0.5, ymax = 30.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 33.5, ymax = 60.5) +
  # annotate("rect", fill = NA, color = "black", size = 0.5, 
  #          xmin = 1.5, xmax = 2.5, ymin = 30.5, ymax = 31.5)

Which capacities are attributed to newborns?

itemsplot_fun(efa_00mo_k, target = "newborns") + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: 9-month-olds

What happens if we limit ourselves to assessments of 9-month-olds’ mental capacities?

Parallel analysis

How many factors to retain?

reten_09mo_PA <- fa.parallel(d_09mo, plot = F); reten_09mo_PA
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 
Call: fa.parallel(x = d_09mo, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 

 Eigen Values of 
  Original factors Simulated data Original components simulated data
1            26.79           1.12               27.31           2.07
2             9.41           0.98               10.07           1.97
3             1.30           0.90                1.83           1.88
4             1.03           0.84                1.60           1.82
reten_09mo_par <- reten_09mo_PA$nfact

What are these factors?

efa_09mo_par <- fa(d_09mo, reten_09mo_par, "oblimin")
heatmap_fun(efa_09mo_par) + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"

Which capacities are attributed to 9-month-olds?

itemsplot_fun(efa_09mo_par, target = "9-month-olds") + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?

reten_09mo_vss <- VSS(d_09mo, plot = F); reten_09mo_vss

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.86  with  1  factors
VSS complexity 2 achieves a maximimum of 0.98  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  6  factors 
BIC achieves a minimum of  -5903.43  with  4  factors
Sample Size adjusted BIC achieves a minimum of  -1255.75  with  8  factors

Statistics by number of factors 
  vss1 vss2    map  dof chisq     prob sqresid  fit RMSEA   BIC SABIC complex eChisq
1 0.86 0.00 0.0715 1710  8151  0.0e+00   117.1 0.86 0.124 -1441  3981     1.0  26699
2 0.71 0.98 0.0136 1651  3905 1.6e-183    15.7 0.98 0.076 -5356  -122     1.4   1726
3 0.54 0.85 0.0105 1593  3224 6.7e-113    12.5 0.99 0.067 -5712  -661     1.7   1135
4 0.46 0.77 0.0085 1536  2713  2.9e-68    10.0 0.99 0.059 -5903 -1033     2.0    718
5 0.46 0.78 0.0081 1480  2449  6.1e-51     8.9 0.99 0.055 -5853 -1160     2.1    578
6 0.47 0.76 0.0081 1425  2264  3.2e-41     8.1 0.99 0.052 -5730 -1212     2.2    485
7 0.47 0.76 0.0082 1371  2112  1.5e-34     7.5 0.99 0.051 -5578 -1231     2.3    419
8 0.47 0.76 0.0085 1318  1958  5.9e-28     7.0 0.99 0.049 -5435 -1256     2.3    367
   SRMR eCRMS  eBIC
1 0.166 0.169 17107
2 0.042 0.044 -7536
3 0.034 0.036 -7801
4 0.027 0.029 -7898
5 0.024 0.027 -7724
6 0.022 0.025 -7508
7 0.021 0.024 -7271
8 0.019 0.023 -7027
reten_09mo_bic <- data.frame(reten_09mo_vss$vss.stats %>%
  rownames_to_column("nfactors") %>%
  top_n(-1, BIC) %>%
  select(nfactors))$nfactors %>% as.numeric()

What are these factors?

efa_09mo_bic <- fa(d_09mo, reten_09mo_bic, "oblimin")
heatmap_fun(efa_09mo_bic) + 
  labs(title = "Minimizing BIC") 
Joining, by = "capacity"

Which capacities are attributed to 9-month-olds?

itemsplot_fun(efa_09mo_bic, target = "9-month-olds") + 
  labs(title = "Minimizing BIC")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

reten_09mo_k <- reten_fun(d_09mo, rot_type = "oblimin")
print(paste("Preset criteria suggest retaining", reten_09mo_k, "factors"))
[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

efa_09mo_k <- fa(d_09mo, reten_09mo_k, "oblimin")
heatmap_fun(efa_09mo_k) + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)") 
Joining, by = "capacity"

Which capacities are attributed to 9-month-olds?

itemsplot_fun(efa_09mo_k, target = "9-month-olds") + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: 5-year-olds

What happens if we limit ourselves to assessments of 5-year-olds’ mental capacities?

Parallel analysis

How many factors to retain?

reten_60mo_PA <- fa.parallel(d_60mo, plot = F); reten_60mo_PA
Parallel analysis suggests that the number of factors =  3  and the number of components =  2 
Call: fa.parallel(x = d_60mo, plot = F)
Parallel analysis suggests that the number of factors =  3  and the number of components =  2 

 Eigen Values of 
  Original factors Simulated data Original components simulated data
1            35.15           1.15               35.53           2.09
2             5.65           0.99                6.20           1.97
3             1.24           0.91                1.65           1.89
reten_60mo_par <- reten_60mo_PA$nfact

What are these factors?

efa_60mo_par <- fa(d_60mo, reten_60mo_par, "oblimin")
 A loading greater than abs(1) was detected.  Examine the loadings carefully.
heatmap_fun(efa_60mo_par) + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"

Which capacities are attributed to 5-year-olds?

itemsplot_fun(efa_60mo_par, target = "5-year-olds") + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?

reten_60mo_vss <- VSS(d_60mo, plot = F); reten_60mo_vss

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.96  with  1  factors
VSS complexity 2 achieves a maximimum of 0.99  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  5  factors 
BIC achieves a minimum of  -4908.09  with  5  factors
Sample Size adjusted BIC achieves a minimum of  -428.6  with  8  factors

Statistics by number of factors 
  vss1 vss2   map  dof chisq     prob sqresid  fit RMSEA   BIC SABIC complex eChisq
1 0.96 0.00 0.050 1710  7767  0.0e+00    49.4 0.96 0.120 -1825  3597     1.0  10319
2 0.70 0.99 0.015 1651  4838 1.7e-309    11.0 0.99 0.090 -4423   812     1.4   1253
3 0.65 0.91 0.012 1593  4122 4.9e-223     8.3 0.99 0.082 -4814   237     1.7    765
4 0.63 0.89 0.011 1536  3726 1.1e-182     7.2 0.99 0.078 -4890   -20     1.8    597
5 0.63 0.89 0.010 1480  3394 1.5e-151     6.4 1.00 0.075 -4908  -215     1.9    481
6 0.63 0.89 0.010 1425  3192 9.1e-137     5.7 1.00 0.073 -4802  -283     1.9    409
7 0.63 0.87 0.010 1371  2974 3.7e-120     5.3 1.00 0.072 -4717  -370     2.0    356
8 0.63 0.87 0.011 1318  2786 4.3e-107     4.8 1.00 0.070 -4608  -429     2.0    308
   SRMR eCRMS  eBIC
1 0.103 0.105   726
2 0.036 0.037 -8008
3 0.028 0.030 -8171
4 0.025 0.027 -8019
5 0.022 0.024 -7821
6 0.021 0.023 -7585
7 0.019 0.022 -7335
8 0.018 0.021 -7085
reten_60mo_bic <- data.frame(reten_60mo_vss$vss.stats %>%
  rownames_to_column("nfactors") %>%
  top_n(-1, BIC) %>%
  select(nfactors))$nfactors %>% as.numeric()

What are these factors?

efa_60mo_bic <- fa(d_60mo, reten_60mo_bic, "oblimin")
heatmap_fun(efa_60mo_bic) + 
  labs(title = "Minimizing BIC") 
Joining, by = "capacity"

Which capacities are attributed to 5-year-olds?

itemsplot_fun(efa_60mo_bic, target = "5-year-olds") + 
  labs(title = "Minimizing BIC")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

reten_60mo_k <- reten_fun(d_60mo, rot_type = "oblimin")
print(paste("Preset criteria suggest retaining", reten_60mo_k, "factors"))
[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

efa_60mo_k <- fa(d_60mo, reten_60mo_k, "oblimin")
heatmap_fun(efa_60mo_k) + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)") 
Joining, by = "capacity"

Which capacities are attributed to 5-year-olds?

itemsplot_fun(efa_60mo_k, target = "5-year-olds") + 
  labs(title = "Preset factor retention criteria\n(Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Demographics

ggplot(d_demo, aes(x = Duration/60)) + 
  geom_histogram(binwidth = 2) +
  geom_vline(xintercept = median(d_demo$Duration/60), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 4)) +
  labs(title = "Duration of study (according to Qualtrics)",
       subtitle = "Blue dotted line marks median",
       x = "Duration (in minutes)",
       y = "Number of participants")
ggplot(d_demo, aes(x = Age)) + 
  geom_histogram(binwidth = 2) +
  geom_vline(xintercept = median(d_demo$Age), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 4)) +
  labs(title = "Particpiant age (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Age (in years)",
       y = "Number of participants")
ggplot(d_demo, aes(x = GenderSex)) + 
  geom_bar() +
  labs(title = "Particpiant gender/sex (self-reported)",
       x = "Gender/sex",
       y = "Number of participants")
ggplot(d_demo, aes(x = gsub('(.{1,30})(\\s|$)', '\\1\n', RaceEthnicity_collapse))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant race/ethnicity (self-reported)",
       x = "Race/ethnicity",
       y = "Number of participants")
ggplot(d_demo, aes(x = FirstLang)) + 
  geom_bar() +
  labs(title = "Particpiant first language (self-reported)",
       x = "Language",
       y = "Number of participants")
ggplot(d_demo, aes(x = factor(Education,
                              levels = levels(d$Education),
                              labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                            levels(d$Education))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant educational attainment (self-reported)",
       x = "Highest level of education completed",
       y = "Number of participants")
ggplot(d_demo, aes(x = Income)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant household income (self-reported)",
       x = "Annual household income",
       y = "Number of participants")
ggplot(d_demo, aes(x = HouseholdSize)) + 
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = median(d_demo$HouseholdSize), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 1)) +
  labs(title = "Particpiant household size (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Number of people in household (adults and children)",
       y = "Number of participants")
ggplot(d_demo, aes(x = MaritalStatus)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant marital status (self-reported)",
       x = "Marital status",
       y = "Number of participants")
ggplot(d_demo, aes(x = Parent)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant parent status (self-reported)",
       subtitle = "'NA' indicates response of 'Prefer not to say'",
       x = "Parent status",
       y = "Number of participants")
ggplot(d_demo %>% filter(Parent == "Yes"), aes(x = ChildrenNumber)) + 
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = median(d_demo[d_demo$Parent == "Yes",]$ChildrenNumber, na.rm = T), 
             color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 1)) +
  labs(title = "Number of children among parents (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Number of children (among parents)",
       y = "Number of participants")
ggplot(d_demo %>% filter(Parent == "Yes"), 
       aes(x = factor(ChildrenOldestAge_collapse,
                      levels = levels(d_demo$ChildrenOldestAge_collapse),
                      labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                    levels(d_demo$ChildrenOldestAge_collapse))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Age of oldest child among parents (self-reported)",
       x = "Age of child in years (among parents)",
       y = "Number of participants")
ggplot(d_demo %>% filter(Parent == "Yes"), 
       aes(x = factor(ChildrenYoungestAge_collapse,
                      levels = levels(d_demo$ChildrenYoungestAge_collapse),
                      labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                    levels(d_demo$ChildrenYoungestAge_collapse))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Age of youngest child among parents (self-reported)",
       x = "Age of child in years (among parents)",
       y = "Number of participants")
LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMSIKZGF0ZTogMjAxOC0wNy0zMQpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjY3KQpgYGAKCgoiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMSIgd2FzIGNvbmR1Y3RlZCBvbiBNVHVyayBvbiAyMDE4LTA3LTMxLgoKT3VyIHBsYW5uZWQgc2FtcGxlIHdhcyAzMDAgcGFydGljaXBhbnRzLCBhbmQgd2UgYW50aWNpcGF0ZWQgdGhhdCByb3VnaGx5IDg1LTkwJSBvZiByZWNydWl0ZWQgcGFydGljaXBhbnRzIHdvdWxkIHBhc3MgYWxsIG9mIG91ciBhdHRlbnRpb24gY2hlY2tzLCBzbyB3ZSBpbml0aWFsbHkgcmVjcnVpdGVkIDM0MiBwYXJ0aWNpcGFudHMuIEFmdGVyIGZpbHRlcmluZyBvdXQgcGFydGljaXBhbnRzIHdobyBmYWlsZWQgYXQgbGVhc3Qgb25lIG9mIG91ciBhdHRlbnRpb24gY2hlY2tzLCB3ZSBlbmRlZCB1cCByZXRhaW5pbmcgb25seSBYWCBwYXJ0aWNpcGFudHMsIHNvIHdlIHJlY3J1aXRlZCBhbiBhZGRpdGlvbmFsIFhYIHBhcnRpY2lwYW50cy4gSW4gdGhlIGVuZCwgd2UgZW5kZWQgdXAgd2l0aCBhIHNhbXBsZSBvZiBYWCBwYXJ0aWNpcGFudHMgd2hvIHBhc3NlZCBvdXIgYXR0ZW50aW9uIGNoZWNrcyAob3V0IG9mIFhYIHBhcnRpY2lwYW50cyByZWNydWl0ZWQgaW4gdG90YWwpLgoKRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0aWVzIGF0IDMgdGFyZ2V0IGFnZXM6IG5ld2Jvcm5zLCA5LW1vbnRoLW9sZHMsIGFuZCA1LXllYXItb2xkcy4gRm9yIGVhY2ggdGFyZ2V0LCB0aGV5IHJhdGVkIDYwIG1lbnRhbCBjYXBhY2l0aWVzIG9uIGEgc2NhbGUgZnJvbSAwIChub3QgYXQgYWxsIGNhcGFibGUpIHRvIDEwMCAoY29tcGxldGVseSBjYXBhYmxlKS4gCgpGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBzdHVkeSwgc2VlIG91ciBwcmVyZWdpc3RyYXRpb24gW2hlcmVdKGh0dHBzOi8vb3NmLmlvL2U2YWpoLykuIAoKYGBge3J9CiMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGFuZ2NvZykgIyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5nY29nL2xhbmdjb2ctcGFja2FnZQpsaWJyYXJ5KHBzeWNoKQoKIyBzZXQgdGhlbWUgZm9yIGdncGxvdHMKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3J9CiMgcnVuIHNvdXJjZSBjb2RlIChleHRyYSBmdW5jdGlvbnMpCnNvdXJjZSgiLi9zY3JpcHRzL21heF9mYWN0b3JzX2VmYS5SIikKCiMgbWFrZSBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIGNyaXRlcmlhCnJldGVuX2Z1biA8LSBmdW5jdGlvbihkZiwgcm90X3R5cGUgPSBjKCJvYmxpbWluIiwgInZhcmltYXgiLCAibm9uZSIpKXsKICAKICAjIGZpZ3VyZSBvdXQgbWF4IG51bWJlciBvZiBmYWN0b3JzIHRvIHJldGFpbgogIG5fdmFyIDwtIGxlbmd0aChuYW1lcyhkZikpCiAgbWF4X2sgPC0gbWF4X29rKG5fdmFyKQogIAogICMgcnVuIGVmYSB3aXRoIG1heCBmYWN0b3JzLCB1bnJvdGF0ZWQKICBmYV91bnJvdCA8LSBmYShkZiwgbmZhY3RvcnMgPSBtYXhfaywgcm90YXRlID0gIm5vbmUiKQogIGVpZ2VuIDwtIGZhX3Vucm90JFZhY2NvdW50ZWQgJT4lCiAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oInBhcmFtIikgJT4lCiAgICBnYXRoZXIoZmFjdG9yLCB2YWx1ZSwgLXBhcmFtKSAlPiUKICAgIHNwcmVhZChwYXJhbSwgdmFsdWUpICU+JQogICAgZmlsdGVyKGBTUyBsb2FkaW5nc2AgPiAxLCBgUHJvcG9ydGlvbiBFeHBsYWluZWRgID4gMC4wNSkKICByZXRhaW5fayA8LSBucm93KGVpZ2VuKQogIAogIGZhX3JvdCA8LSBmYShkZiwgbmZhY3RvcnMgPSByZXRhaW5faywgcm90YXRlID0gcm90X3R5cGUpCiAgbG9hZGluZ3MgPC0gZmFfcm90JGxvYWRpbmdzW10gJT4lCiAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUKICAgIGNvdW50KGZhY3RvcikKICByZXRhaW5fa19maW5hbCA8LSBucm93KGxvYWRpbmdzKQogIAogIHJldHVybihyZXRhaW5fa19maW5hbCkKfQoKIyBtYWtlIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIGhlYXRtYXAKaGVhdG1hcF9mdW4gPC0gZnVuY3Rpb24oZWZhKXsKICAKICAjIGdldCBmYWN0b3IgbG9hZGluZ3MKICBsb2FkaW5ncyA8LSBlZmEkbG9hZGluZ3NbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkKICAKICAjIGdldCBmYS5zb3J0KCkgb3JkZXIKICBvcmRlciA8LSBsb2FkaW5ncyAlPiUKICAgIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICAgIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBhcnJhbmdlKGZhY3RvciwgYWJzKGxvYWRpbmcpKSAlPiUKICAgIG11dGF0ZShvcmRlciA9IDE6bGVuZ3RoKGxldmVscyhmYWN0b3IobG9hZGluZ3MkY2FwYWNpdHkpKSkpICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikKICAKICAjIG1ha2UgcGxvdAogIHBsb3QgPC0gZ2dwbG90KGxvYWRpbmdzICU+JSAKICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbihvcmRlcikgJT4lCiAgICAgICAgICAgICAgICAgICBtdXRhdGUoY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gZmFjdG9yLCAKICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIG9yZGVyKSwgCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwogICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogICAgZ2VvbV90ZXh0KHNpemUgPSAzKSArCiAgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihsaW1pdHMgPSBjKC0xLCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDIwKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICAgbGFicyh4ID0gIiIsIHkgPSAiIikKICAKICByZXR1cm4ocGxvdCkKCn0KCiMgbWFrZSBmdW5jdGlvbiBmb3IgcGxvdHRpbmcgZmFjdG9yIHNjb3JlcyBieSBmYWN0b3IsIHRhcmdldApzY29yZXNwbG90X2Z1biA8LSBmdW5jdGlvbihlZmEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGMoImFsbCIsICJuZXdib3JucyIsICI5LW1vbnRoLW9sZHMiLCAiNS15ZWFyLW9sZHMiKSl7CiAgCiAgIyBnZW5lcmF0ZSBsaXN0IG9mIHRhcmdldHMKICB0YXJnZXRfbGlzdCA8LSBjYXNlX3doZW4oCiAgICB0YXJnZXQgPT0gImFsbCIgfiBjKCJ0YXJnZXQwMG1vIiwgInRhcmdldDA5bW8iLCAidGFyZ2V0NjBtbyIpLAogICAgdGFyZ2V0ID09ICJuZXdib3JucyIgfiAidGFyZ2V0MDBtbyIsCiAgICB0YXJnZXQgPT0gIjktbW9udGgtb2xkcyIgfiAidGFyZ2V0MDltbyIsCiAgICB0YXJnZXQgPT0gIjUteWVhci1vbGRzIiB+ICJ0YXJnZXQ2MG1vIgogICkKICAKICAjIG1ha2UgdXNhYmxlIGRhdGFmcmFtZQogIGRmIDwtIGVmYSRzY29yZXNbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICAgIG11dGF0ZShSZXNwb25zZUlkID0gZ3N1YigiX3RhcmdldC4qJCIsICIiLCBzdWJpZCksCiAgICAgICAgICAgdGFyZ2V0ID0gZ3N1YigiUl8uKl8iLCAiIiwgc3ViaWQpKSAlPiUKICAgIGZpbHRlcih0YXJnZXQgJWluJSB0YXJnZXRfbGlzdCkgJT4lCiAgICBzZWxlY3QoLXN1YmlkKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtYyhSZXNwb25zZUlkLCB0YXJnZXQpKSAlPiUKICAgIG11dGF0ZSh0YXJnZXQgPSByZWNvZGVfZmFjdG9yKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9ICJuZXdib3JucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSAiOS1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9ICI1LXllYXItb2xkcyIpKQogIAogICMgZ2V0IGJvb3RzdHJhcHBlZCBtZWFucwogIGRmX2Jvb3QgPC0gZGYgJT4lCiAgICBncm91cF9ieSh0YXJnZXQsIGZhY3RvcikgJT4lCiAgICBtdWx0aV9ib290X3N0YW5kYXJkKCJzY29yZSIsIG5hLnJtID0gVCkgJT4lCiAgICB1bmdyb3VwKCkKICAKICAjIGdldCBmaXJzdCBpdGVtcyBmb3IgZWFjaCBmYWN0b3IKICBmaXJzdF9pdGVtcyA8LSBlZmEkbG9hZGluZ3NbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBncm91cF9ieShmYWN0b3IpICU+JQogICAgdG9wX24oMywgYWJzKGxvYWRpbmcpKSAlPiUKICAgIG11dGF0ZShjYXBhY2l0eSA9IGdzdWIoIl8iLCAiICIsIGNhcGFjaXR5KSwKICAgICAgICAgICBjYXBfbGlzdCA9IHN0cl9jKGNhcGFjaXR5LCBjb2xsYXBzZSA9ICIsICIpLAogICAgICAgICAgIGNhcF9saXN0ID0gcGFzdGUwKGNhcF9saXN0LCAiLi4uIikpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSwgLWxvYWRpbmcpICU+JQogICAgZGlzdGluY3QoKQoKICAjIG1ha2UgcGxvdAogIHBsb3QgPC0gZ2dwbG90KGRmLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gdGFyZ2V0LCAKICAgICAgICAgICAgICAgICAgICAgeSA9IHNjb3JlLCAKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBmYWN0b3IpKSArCiAgICBmYWNldF9ncmlkKH4gZmFjdG9yKSArCiAgICBnZW9tX3BhdGgoYWVzKGdyb3VwID0gUmVzcG9uc2VJZCksIGFscGhhID0gMC4xKSArCiAgICBnZW9tX3BhdGgoZGF0YSA9IGRmX2Jvb3QsCiAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCBncm91cCA9IGZhY3RvciksIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogICAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkZl9ib290LAogICAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMC43NSkgKwogICAgZ2VvbV90ZXh0KGRhdGEgPSBmaXJzdF9pdGVtcywKICAgICAgICAgICAgICBhZXMobGFiZWwgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgY2FwX2xpc3QpKSwKICAgICAgICAgICAgICB4ID0gMC41LCB5ID0gbWF4KGRmJHNjb3JlKSwgc2l6ZSA9IDMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICBoanVzdCA9IDAsIHZqdXN0ID0gMSkgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHggPSAidGFyZ2V0IiwgeSA9ICJmYWN0b3Igc2NvcmUiLAogICAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIikgKwogICAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiKQogICAgIyBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIHNpemUgPSAxKSkpCiAgCiAgcmV0dXJuKHBsb3QpCiAgCn0KCiMgbWFrZSBmdW5jdGlvbiBmb3IgcGxvdHRpbmcgaW5kaXZpZHVhbCBpdGVtIG1lYW5zIGJ5IGZhY3RvciwgdGFyZ2V0Cml0ZW1zcGxvdF9mdW4gPC0gZnVuY3Rpb24oZWZhLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGMoImFsbCIsICJuZXdib3JucyIsICI5LW1vbnRoLW9sZHMiLCAiNS15ZWFyLW9sZHMiKSl7CiAgCiAgIyBnZW5lcmF0ZSBsaXN0IG9mIHRhcmdldHMKICB0YXJnZXRfbGlzdCA8LSBjYXNlX3doZW4oCiAgICB0YXJnZXQgPT0gImFsbCIgfiBjKCJ0YXJnZXQwMG1vIiwgInRhcmdldDA5bW8iLCAidGFyZ2V0NjBtbyIpLAogICAgdGFyZ2V0ID09ICJuZXdib3JucyIgfiAidGFyZ2V0MDBtbyIsCiAgICB0YXJnZXQgPT0gIjktbW9udGgtb2xkcyIgfiAidGFyZ2V0MDltbyIsCiAgICB0YXJnZXQgPT0gIjUteWVhci1vbGRzIiB+ICJ0YXJnZXQ2MG1vIgogICkKICAKICAjIG1ha2UgdXNhYmxlIGRhdGFmcmFtZQogIGRmIDwtIGRfYWxsICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogICAgbXV0YXRlKFJlc3BvbnNlSWQgPSBnc3ViKCJfdGFyZ2V0LiokIiwgIiIsIHN1YmlkKSwKICAgICAgICAgICB0YXJnZXQgPSBnc3ViKCJSXy4qXyIsICIiLCBzdWJpZCkpICU+JQogICAgZmlsdGVyKHRhcmdldCAlaW4lIHRhcmdldF9saXN0KSAlPiUKICAgIHNlbGVjdCgtc3ViaWQpICU+JQogICAgZ2F0aGVyKGNhcGFjaXR5LCByZXNwb25zZSwgLWMoUmVzcG9uc2VJZCwgdGFyZ2V0KSkgJT4lCiAgICBtdXRhdGUodGFyZ2V0ID0gcmVjb2RlX2ZhY3Rvcih0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAibmV3Ym9ybnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA5bW8iID0gIjktbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0NjBtbyIgPSAiNS15ZWFyLW9sZHMiKSkKICAKICAjIGdldCBmYWN0b3IgbG9hZGluZ3MKICBsb2FkaW5ncyA8LSBlZmEkbG9hZGluZ3NbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkKICAKICAjIGdldCBmYS5zb3J0KCkgb3JkZXIKICBvcmRlciA8LSBlZmEkbG9hZGluZ3NbXSAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgYXJyYW5nZShmYWN0b3IsIGFicyhsb2FkaW5nKSkgJT4lCiAgICBtdXRhdGUob3JkZXIgPSAxOmxlbmd0aChsZXZlbHMoZmFjdG9yKGxvYWRpbmdzJGNhcGFjaXR5KSkpKSAlPiUKICAgIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBvcmRlcikKICAKICAjIGFkZCBvcmRlciB0byBkZgogIGRmIDwtIGRmICU+JSBsZWZ0X2pvaW4ob3JkZXIpCiAgCiAgIyBnZXQgYm9vdHN0cmFwcGVkIG1lYW5zCiAgZGZfYm9vdCA8LSBkZiAlPiUKICAgIGdyb3VwX2J5KHRhcmdldCwgZmFjdG9yLCBjYXBhY2l0eSwgb3JkZXIpICU+JQogICAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicmVzcG9uc2UiLCBuYS5ybSA9IFQpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgbXV0YXRlKGNhcGFjaXR5ID0gZ3N1YigiXyIsICIgIiwgY2FwYWNpdHkpKQogICAgCiAgIyBtYWtlIHBsb3QKICBwbG90IDwtIGdncGxvdChkZiAlPiUgCiAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4ob3JkZXIpICU+JQogICAgICAgICAgICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gZ3N1YigiXyIsICIgIiwgY2FwYWNpdHkpKSwKICAgICAgICAgICAgICAgICBhZXMoeCA9IHJlc3BvbnNlLCAKICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIG9yZGVyKSwgCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZmFjdG9yKSkgKwogICAgZmFjZXRfZ3JpZChmYWN0b3IgfiB0YXJnZXQsIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjAyKSArCiAgICBnZW9tX2Vycm9yYmFyaChkYXRhID0gZGZfYm9vdCwgCiAgICAgICAgICAgICAgICAgICBhZXMoeG1pbiA9IGNpX2xvd2VyLCB4bWF4ID0gY2lfdXBwZXIsIHggPSBOVUxMKSwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGVpZ2h0ID0gMCkgKwogICAgZ2VvbV9wb2ludChkYXRhID0gZGZfYm9vdCwKICAgICAgICAgICAgICAgYWVzKHggPSBtZWFuKSwKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMikgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHggPSAicmVzcG9uc2UiLCB5ID0gIiIsCiAgICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMiKSArCiAgICBndWlkZXMoY29sb3IgPSAibm9uZSIpCiAgICAjIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSwgc2l6ZSA9IDIpKSkKICAKICByZXR1cm4ocGxvdCkKICAKfQoKYGBgCgoKIyBEYXRhIHByZXBhcmF0aW9uCgpgYGB7cn0KIyBsb2FkIGluIHJhdyBkYXRhCmQwIDwtIHJlYWQuY3N2KCIuL2RhdGEvQmFieSBtZW50YWwgbGlmZTogU3R1ZHkgMV9BdWd1c3QgMSwgMjAxOF8wNC4zOC5jc3YiKQpgYGAKCmBgYHtyfQojIG1ha2UgcXVlc3Rpb24ga2V5CnF1ZXN0aW9uX2tleSA8LSBkMFsxLF0gJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInF1ZXN0aW9uX3F1YWx0cmljcyIpICU+JQogIHJlbmFtZSgicXVlc3Rpb25fdGV4dCIgPSBYMSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gcmVjb2RlKHF1ZXN0aW9uX3F1YWx0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cmF0aW9uLi5pbi5zZWNvbmRzLiIgPSAiRHVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIiID0gIkFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMyIgPSAiR2VuZGVyU2V4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEzXzNfVEVYVCIgPSAiR2VuZGVyU2V4X2ZpbGxJbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRNCIgPSAiRW5nbGlzaFByb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTUiID0gIkZpcnN0TGFuZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRNV8yX1RFWFQiID0gIkZpcnN0TGFuZ19maWxsSW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTE4IiA9ICJSYWNlRXRobmljaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlExOF8xMF9URVhUIiA9ICJSYWNlRXRobmljaXR5X2ZpbGxJbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMTkiID0gIkVkdWNhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjAiID0gIkluY29tZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjEiID0gIk1hcml0YWxTdGF0dXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIxXzZfVEVYVCIgPSAiTWFyaXRhbFN0YXR1c19maWxsSW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIyIiA9ICJIb3VzZWhvbGRTaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyMyIgPSAiUGFyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyNSIgPSAiQ2hpbGRyZW5OdW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI2IiA9ICJDaGlsZHJlbllvdW5nZXN0QWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyNl8xX1RFWFQiID0gIkNoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjZfMl9URVhUIiA9ICJDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI3IiA9ICJDaGlsZHJlbk9sZGVzdEFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjdfMV9URVhUIiA9ICJDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyN18yX1RFWFQiID0gIkNoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI4IiA9ICJBdHRlbnRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI5IiA9ICJDb21tZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gcXVlc3Rpb25fcXVhbHRyaWNzKSwKICAgICAgICAgcXVlc3Rpb24gPSBjYXNlX3doZW4oZ3JlcGwoInRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIiwgcXVlc3Rpb25fdGV4dCkgfgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoIl4uKmV4dGVudCBpcyBhICIsICIiLCBxdWVzdGlvbl90ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBjYXNlX3doZW4oZ3JlcGwoImNhcGFibGUgb2YuLi4iLCBxdWVzdGlvbl90ZXh0KSB+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiY2FwYWJsZSBvZi4uLiAiLCAiIiwgdG9sb3dlcihxdWVzdGlvbikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gcXVlc3Rpb24pLAogICAgICAgICBxdWVzdGlvbiA9IGdzdWIoIiAiLCAiXyIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCInIiwgIiIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCJuZXdib3JuXy1fIiwgInRhcmdldDAwbW9fIiwgcXVlc3Rpb24pLAogICAgICAgICBxdWVzdGlvbiA9IGdzdWIoIjktbW9udGgtb2xkXy1fIiwgInRhcmdldDA5bW9fIiwgcXVlc3Rpb24pLAogICAgICAgICBxdWVzdGlvbiA9IGdzdWIoIjUteWVhci1vbGRfLV8iLCAidGFyZ2V0NjBtb18iLCBxdWVzdGlvbikpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIi0iLCAiXyIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCIgXFwoZm9yX2V4YW1wbGUsX3Ntb290aCxfcm91Z2hcXCkiLCAiIiwgcXVlc3Rpb24pKQpgYGAKCmBgYHtyfQojIHJlbmFtZSBxdWVzdGlvbnMKZDEgPC0gZDAgJT4lCiAgZmlsdGVyKGdyZXBsKCJSXyIsIFJlc3BvbnNlSWQpKSAlPiUgIyBnZXQgcmlkIG9mIGV4dHJhIGluZm8gaW4gZmlyc3QgdHdvIHJvd3MKICBnYXRoZXIocXVlc3Rpb25fcXVhbHRyaWNzLCByZXNwb25zZSwgLVJlc3BvbnNlSWQpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIHNlbGVjdChxdWVzdGlvbl9xdWFsdHJpY3MsIHF1ZXN0aW9uKSkgJT4lCiAgc2VsZWN0KC1xdWVzdGlvbl9xdWFsdHJpY3MpICU+JQogIHNwcmVhZChxdWVzdGlvbiwgcmVzcG9uc2UpCmBgYAoKYGBge3J9CiMgaW1wbGVtZW50IGluY2x1c2lvbi9leGNsdXNpb24gY3JpdGVyaWEKZDIgPC0gZDEgJT4lCiAgZmlsdGVyKEFnZSA+PSAxOCwgQWdlIDw9IDQ1LAogICAgICAgICBFbmdsaXNoUHJvZiAlaW4lIGMoIkFkdmFuY2VkIiwgIlN1cGVyaW9yIiksCiAgICAgICAgIGB0YXJnZXQwMG1vX3BsZWFzZV9zZWxlY3RfMzRgID09IDM0LAogICAgICAgICBgdGFyZ2V0MDltb19wbGVhc2Vfc2VsZWN0XzkwYCA9PSA5MCwKICAgICAgICAgYHRhcmdldDYwbW9fcGxlYXNlX3NlbGVjdF80YCA9PSA0LAogICAgICAgICBBdHRlbnRpb24gPT0gIlllcyIpCmBgYAoKYGBge3J9CiMgcmVjb2RlIHZhcmlhYmxlcyAmIGRyb3AgZXh0cmFuZW91cyB2YXJpYWJsZXMKZDMgPC0gZDIgJT4lCiAgc2VsZWN0KC1jKERpc3RyaWJ1dGlvbkNoYW5uZWwsIEVuZERhdGUsIEV4dGVybmFsUmVmZXJlbmNlLCBGaW5pc2hlZCwgSVBBZGRyZXNzLCAKICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkxvY2F0aW9uIiksIE1UdXJrQ29kZSwgcGF5bWVudCwgUHJvZ3Jlc3MsIAogICAgICAgICAgICBzdGFydHNfd2l0aCgiUmVjaXBpZW50IiksIFJlY29yZGVkRGF0ZSwgU3RhcnREYXRlLCBTdGF0dXMsIAogICAgICAgICAgICB0aW1lRXN0aW1hdGUsIFVzZXJMYW5ndWFnZSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKGMoc3RhcnRzX3dpdGgoInRhcmdldCIpLCBBZ2UsIENoaWxkcmVuTnVtYmVyLCAKICAgICAgICAgICAgICAgICAgIENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjEsIENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIsIAogICAgICAgICAgICAgICAgICAgQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xLCBDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIsCiAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiwgSG91c2Vob2xkU2l6ZSkpLAogICAgICAgICAgICBmdW5zKGFzLm51bWVyaWMoLikpKSAlPiUKICBtdXRhdGUoRWR1Y2F0aW9uID0gZmFjdG9yKEVkdWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIHNjaG9vbGluZyBjb21wbGV0ZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51cnNlcnkgc2Nob29sIHRvIDh0aCBncmFkZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBoaWdoIHNjaG9vbCwgbm8gZGlwbG9tYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBzY2hvb2wgZ3JhZHVhdGUsIGRpcGxvbWEgb3IgZXF1aXZhbGVudCAoaW5jbHVkaW5nIEdFRCkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgY29sbGVnZSBjcmVkaXQsIG5vIGRlZ3JlZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhZGUgc2Nob29sLCB0ZWNobmljYWwgc2Nob29sLCBvciB2b2NhdGlvbmFsIHNjaG9vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NvY2lhdGUncyBkZWdyZWUgKGZvciBleGFtcGxlLCBBQSwgQVMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY2hlbG9yJ3MgZGVncmVlIChmb3IgZXhhbXBsZSwgQkEsIEJTKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXN0ZXIncyBkZWdyZWUgKGZvciBleGFtcGxlLCBNQSwgTVMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3RvciBvciBwcm9mZXNzaW9uYWwgZGVncmVlIChmb3IgZXhhbXBsZSwgUGhELCBKRCwgTUQsIE1CQSkiKSksCiAgICAgICAgIEluY29tZSA9IGZhY3RvcihJbmNvbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIkNSwwMDEgLSAxNSwwMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQxNSwwMDEgLSAzMCwwMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQzMCwwMDEgLSA2MCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJDYwLDAwMSAtIDkwLDAwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkOTAsMDAxIC0gMTUwLDAwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHcmVhdGVyIHRoYW4gJDE1MCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZmVyIG5vdCB0byBzYXkiKSksCiAgICAgICAgIFBhcmVudCA9IGZhY3RvcihQYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSkpCmBgYAoKYGBge3J9CiMgbWFrZSB1c2VmdWwgZGF0YXNldHMKIyBmaW5hbCBkYXRhc2V0IHdpdGggYWxsIG1lYXN1cmVkIHZhcmlhYmxlcwpkIDwtIGQzICU+JSBkaXN0aW5jdCgpCgojIGRlbW9ncmFwaGljIGluZm9ybWF0aW9uCmRfZGVtbyA8LSBkICU+JSAKICBzZWxlY3QoUmVzcG9uc2VJZCwgRHVyYXRpb24sCiAgICAgICAgIEFnZSwgc3RhcnRzX3dpdGgoIkdlbmRlclNleCIpLCBzdGFydHNfd2l0aCgiUmFjZUV0aG5pY2l0eSIpLAogICAgICAgICBzdGFydHNfd2l0aCgiRmlyc3RMYW5nIiksCiAgICAgICAgIEVkdWNhdGlvbiwgSW5jb21lLCBIb3VzZWhvbGRTaXplLAogICAgICAgICBzdGFydHNfd2l0aCgiTWFyaXRhbFN0YXR1cyIpLAogICAgICAgICBQYXJlbnQsIHN0YXJ0c193aXRoKCJDaGlsZHJlbiIpLCAKICAgICAgICAgQ29tbWVudHMpICU+JQogIG11dGF0ZShSYWNlRXRobmljaXR5X2NvbGxhcHNlID0gaWZlbHNlKGdyZXBsKCIsKFtBLVphLXpdKSIsIFJhY2VFdGhuaWNpdHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSIsIFJhY2VFdGhuaWNpdHkpKSAlPiUKICBtdXRhdGUoQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UgPSBjYXNlX3doZW4oCiAgICBDaGlsZHJlbk9sZGVzdEFnZSAlaW4lIGMoIk15IG9sZGVzdCBjaGlsZCBoYXMgbm90IHlldCBiZWVuIGJvcm4gKEkgYW0vbXkgcGFydG5lciBpcyBwcmVnbmFudCkiLCAiTXkgb2xkZXN0IGNoaWxkIGlzIGRlY2Vhc2VkIiwgIlByZWZlciBub3QgdG8gc2F5IikgfiBDaGlsZHJlbk9sZGVzdEFnZSwKICAgIENoaWxkcmVuT2xkZXN0QWdlID09ICJJbiBtb250aHM6IiB+IAogICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xKS8xMiA8IDEsCiAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSkvMTIgPCAzLCAKICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjEpLzEyIDwgNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gNSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjEpLzEyIDwgMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xKS8xMiA8IDE4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiKSkpKSksCiAgICBDaGlsZHJlbk9sZGVzdEFnZSA9PSAiSW4geWVhcnM6IiB+CiAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIpIDwgMSwKICAgICAgICAgICAgICI8IDEgeWVhciIsCiAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yKSA8IDMsIAogICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMikgPCA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA1IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMikgPCAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAtIDEwIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIpIDwgMTgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMCAtIDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxOCB5ZWFycyIpKSkpKSwKICAgIFRSVUUgfiAiTkEiKSkgJT4lCiAgbXV0YXRlKENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlID0gCiAgICAgICAgICAgZmFjdG9yKENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNeSBvbGRlc3QgY2hpbGQgaGFzIG5vdCB5ZXQgYmVlbiBib3JuIChJIGFtL215IHBhcnRuZXIgaXMgcHJlZ25hbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA1IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAtIDEwIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBvbGRlc3QgY2hpbGQgaXMgZGVjZWFzZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVmZXIgbm90IHRvIHNheSIpKSkgJT4lCiAgbXV0YXRlKENoaWxkcmVuWW91bmdlc3RBZ2VfY29sbGFwc2UgPSBjYXNlX3doZW4oCiAgICBDaGlsZHJlbllvdW5nZXN0QWdlICVpbiUgYygiTXkgeW91bmdlc3QgY2hpbGQgaGFzIG5vdCB5ZXQgYmVlbiBib3JuIChJIGFtL215IHBhcnRuZXIgaXMgcHJlZ25hbnQpIiwgIk15IHlvdW5nZXN0IGNoaWxkIGlzIGRlY2Vhc2VkIiwgIlByZWZlciBub3QgdG8gc2F5IikgfiBDaGlsZHJlbllvdW5nZXN0QWdlLAogICAgQ2hpbGRyZW5Zb3VuZ2VzdEFnZSA9PSAiSW4gbW9udGhzOiIgfiAKICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDEsCiAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDMsIAogICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjEpLzEyIDwgMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjEpLzEyIDwgMTgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMCAtIDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxOCB5ZWFycyIpKSkpKSwKICAgIENoaWxkcmVuWW91bmdlc3RBZ2UgPT0gIkluIHllYXJzOiIgfgogICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgMSwKICAgICAgICAgICAgICI8IDEgeWVhciIsCiAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgMywgCiAgICAgICAgICAgICAgICAgICAgIjEgLSAzIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gNSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMikgPCAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAtIDEwIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMikgPCAxOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDE4IHllYXJzIikpKSkpLAogICAgVFJVRSB+ICJOQSIpKSAlPiUKICBtdXRhdGUoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSA9IAogICAgICAgICAgIGZhY3RvcihDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNeSBZb3VuZ2VzdCBjaGlsZCBoYXMgbm90IHlldCBiZWVuIGJvcm4gKEkgYW0vbXkgcGFydG5lciBpcyBwcmVnbmFudCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8IDEgeWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEgLSAzIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC0gMTAgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMCAtIDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15IFlvdW5nZXN0IGNoaWxkIGlzIGRlY2Vhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZmVyIG5vdCB0byBzYXkiKSkpICAKIyBhbGwgYXNzZXNzbWVudHMgb2YgQUxMIFRBUkdFVFMsIFJlcHNvbnNlSWQgYXMgcm93bmFtZXMKZF9hbGwgPC0gZCAlPiUgCiAgc2VsZWN0KFJlc3BvbnNlSWQsIHN0YXJ0c193aXRoKCJ0YXJnZXQiKSwgLWNvbnRhaW5zKCJwbGVhc2Vfc2VsZWN0IikpICU+JQogIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIC1SZXNwb25zZUlkKSAlPiUKICBtdXRhdGUodGFyZ2V0ID0gZ3N1YigiXy4qJCIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgIGNhcGFjaXR5ID0gZ3N1YigidGFyZ2V0Li5tb18iLCAiIiwgcXVlc3Rpb24pLAogICAgICAgICBzdWJpZCA9IHBhc3RlKFJlc3BvbnNlSWQsIHRhcmdldCwgc2VwID0gIl8iKSkgJT4lCiAgc2VsZWN0KC1SZXNwb25zZUlkLCAtcXVlc3Rpb24sIC10YXJnZXQpICU+JQogIHNwcmVhZChjYXBhY2l0eSwgcmVzcG9uc2UpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKQoKIyBhbGwgYXNzZXNzbWVudHMgb2YgTkVXQk9STlMsIFJlcHNvbnNlSWQgYXMgcm93bmFtZXMKZF8wMG1vIDwtIGRfYWxsICU+JSAKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgZmlsdGVyKGdyZXBsKCJ0YXJnZXQwMG1vIiwgc3ViaWQpKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJ0YXJnZXQuLm1vXyIsICIiLCBzdWJpZCkpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKQoKIyBhbGwgYXNzZXNzbWVudHMgb2YgOS1NT05USC1PTERTLCBSZXBzb25zZUlkIGFzIHJvd25hbWVzCmRfMDltbyA8LSBkX2FsbCAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZpbHRlcihncmVwbCgidGFyZ2V0MDltbyIsIHN1YmlkKSkgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigidGFyZ2V0Li5tb18iLCAiIiwgc3ViaWQpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgYWxsIGFzc2Vzc21lbnRzIG9mIDUtWUVBUi1PTERTLCBSZXBzb25zZUlkIGFzIHJvd25hbWVzCmRfNjBtbyA8LSBkX2FsbCAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZpbHRlcihncmVwbCgidGFyZ2V0NjBtbyIsIHN1YmlkKSkgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigidGFyZ2V0Li5tb18iLCAiIiwgc3ViaWQpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKYGBgCgoKIyBFRkE6IGFsbCB0YXJnZXRzCgpPdXIgcHJpbWFyeSBhbmFseXNpcyBpcyBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgKEVGQSkgY29sbGFwc2luZyBhY3Jvc3MgYWxsIDMgdGFyZ2V0IGNoYXJhY3RlcnMgKGFuZCB0cmVhdGluZyBhbiBpbmRpdmlkdWFsIHBhcnRpY2lwYW50J3MgcmVzcG9uc2VzIHRvIGVhY2ggY2hhcmFjdGVyIGFzIGlmIHRoZXkgd2VyZSBpbmRlcGVuZGVudCBkYXRhIHBvaW50cykgLSBzZWUgdGhlIHByZXJlZ2lzdHJhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgCgpXZSBwbGFubmVkIHRvIGV4YW1pbmUgdGhyZWUgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluOiBQYXJhbGxlbCBhbmFseXNpcywgbWluaW1pemluZyBCSUMsIGFuZCBhIHNldCBvZiBwcmVzZXQgY3JpdGVyaWEgb3V0bGluZWQgaW4gV2Vpc21hbiBldCBhbC4gKDIwMTcpLiBIZXJlIHdlIGxvb2sgYXQgZWFjaCBzb2x1dGlvbiBpbiB0dXJuLgoKIyMgUGFyYWxsZWwgYW5hbHlzaXMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfUEEgPC0gZmEucGFyYWxsZWwoZF9hbGwsIHBsb3QgPSBGKTsgcmV0ZW5fYWxsX1BBCnJldGVuX2FsbF9wYXIgPC0gcmV0ZW5fYWxsX1BBJG5mYWN0CmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9wYXIgPC0gZmEoZF9hbGwsIHJldGVuX2FsbF9wYXIsICJvYmxpbWluIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV9hbGxfcGFyKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKSAjKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gMC41LCB4bWF4ID0gMS41LCB5bWluID0gMS41LCB5bWF4ID0gMjEuNSkgKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gMS41LCB4bWF4ID0gMi41LCB5bWluID0gMjUuNSwgeW1heCA9IDMzLjUpICsKICAjIGFubm90YXRlKCJyZWN0IiwgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUsIAogICMgICAgICAgICAgeG1pbiA9IDEuNSwgeG1heCA9IDIuNSwgeW1pbiA9IDIyLjUsIHltYXggPSAyNC41KSArCiAgIyBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41LCAKICAjICAgICAgICAgIHhtaW4gPSAyLjUsIHhtYXggPSAzLjUsIHltaW4gPSAzMy41LCB5bWF4ID0gMzQuNSkgKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gMi41LCB4bWF4ID0gMy41LCB5bWluID0gMzYuNSwgeW1heCA9IDU0LjUpICsKICAjIGFubm90YXRlKCJyZWN0IiwgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUsIAogICMgICAgICAgICAgeG1pbiA9IDMuNSwgeG1heCA9IDQuNSwgeW1pbiA9IDU0LjUsIHltYXggPSA1NS41KSArCiAgIyBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41LCAKICAjICAgICAgICAgIHhtaW4gPSAzLjUsIHhtYXggPSA0LjUsIHltaW4gPSA1Ni41LCB5bWF4ID0gNTcuNSkgKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gMy41LCB4bWF4ID0gNC41LCB5bWluID0gNTguNSwgeW1heCA9IDYwLjUpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gImFsbCIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfdnNzIDwtIFZTUyhkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfdnNzCnJldGVuX2FsbF9iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl9hbGxfdnNzJHZzcy5zdGF0cyAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm5mYWN0b3JzIikgJT4lCiAgdG9wX24oLTEsIEJJQykgJT4lCiAgc2VsZWN0KG5mYWN0b3JzKSkkbmZhY3RvcnMgJT4lIGFzLm51bWVyaWMoKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfYmljIDwtIGZhKGRfYWxsLCByZXRlbl9hbGxfYmljLCAib2JsaW1pbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfYWxsX2JpYykgKyAKICBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikgIysKICAjIGFubm90YXRlKCJyZWN0IiwgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUsIAogICMgICAgICAgICAgeG1pbiA9IDAuNSwgeG1heCA9IDEuNSwgeW1pbiA9IDAuNSwgeW1heCA9IDIxLjUpICsKICAjIGFubm90YXRlKCJyZWN0IiwgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUsIAogICMgICAgICAgICAgeG1pbiA9IDEuNSwgeG1heCA9IDIuNSwgeW1pbiA9IDIyLjUsIHltYXggPSAzMi41KSArCiAgIyBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41LCAKICAjICAgICAgICAgIHhtaW4gPSAyLjUsIHhtYXggPSAzLjUsIHltaW4gPSAzMi41LCB5bWF4ID0gNDguNSkgKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gMy41LCB4bWF4ID0gNC41LCB5bWluID0gNDkuNSwgeW1heCA9IDUwLjUpICsKICAjIGFubm90YXRlKCJyZWN0IiwgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUsIAogICMgICAgICAgICAgeG1pbiA9IDMuNSwgeG1heCA9IDQuNSwgeW1pbiA9IDUxLjUsIHltYXggPSA1Mi41KSArCiAgIyBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41LCAKICAjICAgICAgICAgIHhtaW4gPSA0LjUsIHhtYXggPSA1LjUsIHltaW4gPSA1Mi41LCB5bWF4ID0gNTQuNSkgKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gNC41LCB4bWF4ID0gNS41LCB5bWluID0gNTYuNSwgeW1heCA9IDYwLjUpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gImFsbCIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikKYGBgCgoKIyMgUHJlc2V0IHJldGVudGlvbiBjcml0ZXJpYQoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9rIDwtIHJldGVuX2Z1bihkX2FsbCwgcm90X3R5cGUgPSAib2JsaW1pbiIpCnByaW50KHBhc3RlKCJQcmVzZXQgY3JpdGVyaWEgc3VnZ2VzdCByZXRhaW5pbmciLCByZXRlbl9hbGxfaywgImZhY3RvcnMiKSkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX2sgPC0gZmEoZF9hbGwsIHJldGVuX2FsbF9rLCAib2JsaW1pbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfYWxsX2spICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYVxuKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpICMrCiAgIyBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41LCAKICAjICAgICAgICAgIHhtaW4gPSAwLjUsIHhtYXggPSAxLjUsIHltaW4gPSAwLjUsIHltYXggPSAzMC41KSArCiAgIyBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41LCAKICAjICAgICAgICAgIHhtaW4gPSAxLjUsIHhtYXggPSAyLjUsIHltaW4gPSAzMy41LCB5bWF4ID0gNjAuNSkgKwogICMgYW5ub3RhdGUoInJlY3QiLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgCiAgIyAgICAgICAgICB4bWluID0gMS41LCB4bWF4ID0gMi41LCB5bWluID0gMzAuNSwgeW1heCA9IDMxLjUpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2ssIHRhcmdldCA9ICJhbGwiKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfaywgdGFyZ2V0ID0gImFsbCIpICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBFRkE6IG5ld2Jvcm5zCgpXaGF0IGhhcHBlbnMgaWYgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIGFzc2Vzc21lbnRzIG9mIG5ld2Jvcm5zJyBtZW50YWwgY2FwYWNpdGllcz8KCiMjIFBhcmFsbGVsIGFuYWx5c2lzCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fMDBtb19QQSA8LSBmYS5wYXJhbGxlbChkXzAwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fMDBtb19QQQpyZXRlbl8wMG1vX3BhciA8LSByZXRlbl8wMG1vX1BBJG5mYWN0CmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzAwbW9fcGFyIDwtIGZhKGRfMDBtbywgcmV0ZW5fMDBtb19wYXIsICJvYmxpbWluIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV8wMG1vX3BhcikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byBuZXdib3Jucz8KCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAyfQppdGVtc3Bsb3RfZnVuKGVmYV8wMG1vX3BhciwgdGFyZ2V0ID0gIm5ld2Jvcm5zIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wMG1vX3ZzcyA8LSBWU1MoZF8wMG1vLCBwbG90ID0gRik7IHJldGVuXzAwbW9fdnNzCnJldGVuXzAwbW9fYmljIDwtIGRhdGEuZnJhbWUocmV0ZW5fMDBtb192c3MkdnNzLnN0YXRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigibmZhY3RvcnMiKSAlPiUKICB0b3BfbigtMSwgQklDKSAlPiUKICBzZWxlY3QobmZhY3RvcnMpKSRuZmFjdG9ycyAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzAwbW9fYmljIDwtIGZhKGRfMDBtbywgcmV0ZW5fMDBtb19iaWMsICJvYmxpbWluIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV8wMG1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikgCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gbmV3Ym9ybnM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDBtb19iaWMsIHRhcmdldCA9ICJuZXdib3JucyIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wMG1vX2sgPC0gcmV0ZW5fZnVuKGRfMDBtbywgcm90X3R5cGUgPSAib2JsaW1pbiIpCnByaW50KHBhc3RlKCJQcmVzZXQgY3JpdGVyaWEgc3VnZ2VzdCByZXRhaW5pbmciLCByZXRlbl8wMG1vX2ssICJmYWN0b3JzIikpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzAwbW9fayA8LSBmYShkXzAwbW8sIHJldGVuXzAwbW9faywgIm9ibGltaW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMn0KaGVhdG1hcF9mdW4oZWZhXzAwbW9faykgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikgCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gbmV3Ym9ybnM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDBtb19rLCB0YXJnZXQgPSAibmV3Ym9ybnMiKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWFcbihXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCgojIEVGQTogOS1tb250aC1vbGRzCgpXaGF0IGhhcHBlbnMgaWYgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIGFzc2Vzc21lbnRzIG9mIDktbW9udGgtb2xkcycgbWVudGFsIGNhcGFjaXRpZXM/CgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzA5bW9fUEEgPC0gZmEucGFyYWxsZWwoZF8wOW1vLCBwbG90ID0gRik7IHJldGVuXzA5bW9fUEEKcmV0ZW5fMDltb19wYXIgPC0gcmV0ZW5fMDltb19QQSRuZmFjdApgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wOW1vX3BhciA8LSBmYShkXzA5bW8sIHJldGVuXzA5bW9fcGFyLCAib2JsaW1pbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfMDltb19wYXIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gOS1tb250aC1vbGRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzA5bW9fcGFyLCB0YXJnZXQgPSAiOS1tb250aC1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wOW1vX3ZzcyA8LSBWU1MoZF8wOW1vLCBwbG90ID0gRik7IHJldGVuXzA5bW9fdnNzCnJldGVuXzA5bW9fYmljIDwtIGRhdGEuZnJhbWUocmV0ZW5fMDltb192c3MkdnNzLnN0YXRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigibmZhY3RvcnMiKSAlPiUKICB0b3BfbigtMSwgQklDKSAlPiUKICBzZWxlY3QobmZhY3RvcnMpKSRuZmFjdG9ycyAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzA5bW9fYmljIDwtIGZhKGRfMDltbywgcmV0ZW5fMDltb19iaWMsICJvYmxpbWluIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV8wOW1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikgCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gOS1tb250aC1vbGRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzA5bW9fYmljLCB0YXJnZXQgPSAiOS1tb250aC1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikKYGBgCgoKIyMgUHJlc2V0IHJldGVudGlvbiBjcml0ZXJpYQoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzA5bW9fayA8LSByZXRlbl9mdW4oZF8wOW1vLCByb3RfdHlwZSA9ICJvYmxpbWluIikKcHJpbnQocGFzdGUoIlByZXNldCBjcml0ZXJpYSBzdWdnZXN0IHJldGFpbmluZyIsIHJldGVuXzA5bW9faywgImZhY3RvcnMiKSkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDltb19rIDwtIGZhKGRfMDltbywgcmV0ZW5fMDltb19rLCAib2JsaW1pbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfMDltb19rKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWFcbihXZWlzbWFuIGV0IGFsLiwgMjAxNykiKSAKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byA5LW1vbnRoLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDltb19rLCB0YXJnZXQgPSAiOS1tb250aC1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBFRkE6IDUteWVhci1vbGRzCgpXaGF0IGhhcHBlbnMgaWYgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIGFzc2Vzc21lbnRzIG9mIDUteWVhci1vbGRzJyBtZW50YWwgY2FwYWNpdGllcz8KCiMjIFBhcmFsbGVsIGFuYWx5c2lzCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fNjBtb19QQSA8LSBmYS5wYXJhbGxlbChkXzYwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fNjBtb19QQQpyZXRlbl82MG1vX3BhciA8LSByZXRlbl82MG1vX1BBJG5mYWN0CmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzYwbW9fcGFyIDwtIGZhKGRfNjBtbywgcmV0ZW5fNjBtb19wYXIsICJvYmxpbWluIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV82MG1vX3BhcikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byA1LXllYXItb2xkcz8KCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAyfQppdGVtc3Bsb3RfZnVuKGVmYV82MG1vX3BhciwgdGFyZ2V0ID0gIjUteWVhci1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl82MG1vX3ZzcyA8LSBWU1MoZF82MG1vLCBwbG90ID0gRik7IHJldGVuXzYwbW9fdnNzCnJldGVuXzYwbW9fYmljIDwtIGRhdGEuZnJhbWUocmV0ZW5fNjBtb192c3MkdnNzLnN0YXRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigibmZhY3RvcnMiKSAlPiUKICB0b3BfbigtMSwgQklDKSAlPiUKICBzZWxlY3QobmZhY3RvcnMpKSRuZmFjdG9ycyAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzYwbW9fYmljIDwtIGZhKGRfNjBtbywgcmV0ZW5fNjBtb19iaWMsICJvYmxpbWluIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV82MG1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikgCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gNS15ZWFyLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfNjBtb19iaWMsIHRhcmdldCA9ICI1LXllYXItb2xkcyIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl82MG1vX2sgPC0gcmV0ZW5fZnVuKGRfNjBtbywgcm90X3R5cGUgPSAib2JsaW1pbiIpCnByaW50KHBhc3RlKCJQcmVzZXQgY3JpdGVyaWEgc3VnZ2VzdCByZXRhaW5pbmciLCByZXRlbl82MG1vX2ssICJmYWN0b3JzIikpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzYwbW9fayA8LSBmYShkXzYwbW8sIHJldGVuXzYwbW9faywgIm9ibGltaW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMn0KaGVhdG1hcF9mdW4oZWZhXzYwbW9faykgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikgCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gNS15ZWFyLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfNjBtb19rLCB0YXJnZXQgPSAiNS15ZWFyLW9sZHMiKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWFcbihXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCgojIERlbW9ncmFwaGljcwoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gRHVyYXRpb24vNjApKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kRHVyYXRpb24vNjApLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJEdXJhdGlvbiBvZiBzdHVkeSAoYWNjb3JkaW5nIHRvIFF1YWx0cmljcykiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJEdXJhdGlvbiAoaW4gbWludXRlcykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBBZ2UpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kQWdlKSwgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCA0KSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgYWdlIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIkFnZSAoaW4geWVhcnMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gR2VuZGVyU2V4KSkgKyAKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGdlbmRlci9zZXggKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiR2VuZGVyL3NleCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCBSYWNlRXRobmljaXR5X2NvbGxhcHNlKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCByYWNlL2V0aG5pY2l0eSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJSYWNlL2V0aG5pY2l0eSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEZpcnN0TGFuZykpICsgCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBmaXJzdCBsYW5ndWFnZSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJMYW5ndWFnZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IGZhY3RvcihFZHVjYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkJEVkdWNhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMoZCRFZHVjYXRpb24pKSkpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJIaWdoZXN0IGxldmVsIG9mIGVkdWNhdGlvbiBjb21wbGV0ZWQiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBJbmNvbWUpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgaG91c2Vob2xkIGluY29tZSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJBbm51YWwgaG91c2Vob2xkIGluY29tZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEhvdXNlaG9sZFNpemUpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kSG91c2Vob2xkU2l6ZSksIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMCwgMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGhvdXNlaG9sZCBzaXplIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIk51bWJlciBvZiBwZW9wbGUgaW4gaG91c2Vob2xkIChhZHVsdHMgYW5kIGNoaWxkcmVuKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgbWFyaXRhbCBzdGF0dXMgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiTWFyaXRhbCBzdGF0dXMiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBQYXJlbnQpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgcGFyZW50IHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiJ05BJyBpbmRpY2F0ZXMgcmVzcG9uc2Ugb2YgJ1ByZWZlciBub3QgdG8gc2F5JyIsCiAgICAgICB4ID0gIlBhcmVudCBzdGF0dXMiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbyAlPiUgZmlsdGVyKFBhcmVudCA9PSAiWWVzIiksIGFlcyh4ID0gQ2hpbGRyZW5OdW1iZXIpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW9bZF9kZW1vJFBhcmVudCA9PSAiWWVzIixdJENoaWxkcmVuTnVtYmVyLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMCwgMSkpICsKICBsYWJzKHRpdGxlID0gIk51bWJlciBvZiBjaGlsZHJlbiBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIk51bWJlciBvZiBjaGlsZHJlbiAoYW1vbmcgcGFyZW50cykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbyAlPiUgZmlsdGVyKFBhcmVudCA9PSAiWWVzIiksIAogICAgICAgYWVzKHggPSBmYWN0b3IoQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBsZXZlbHMoZF9kZW1vJENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSkpKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJBZ2Ugb2Ygb2xkZXN0IGNoaWxkIGFtb25nIHBhcmVudHMgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiQWdlIG9mIGNoaWxkIGluIHllYXJzIChhbW9uZyBwYXJlbnRzKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiB5b3VuZ2VzdCBjaGlsZCBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFnZSBvZiBjaGlsZCBpbiB5ZWFycyAoYW1vbmcgcGFyZW50cykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgoK